#ifndef MLVMANAGER_H
#define MLVMANAGER_H

#include <QObject>
#include <QMap>
#include <QTextCodec>
#include "node.h"
#include "edge.h"


//Элемент словаря имён
struct elementNamesTable {
    int id;
    QString name;
};

//Элемент таблици связий
struct elementRelationsTable{
    int idA;
    int idAlph;
    int idB;
};

struct elementChildren {
    int idCase; //Падеж (дуга)
    int idNode; //Значение падежа (вершина)
};

class mlvManager : public QObject
{
    Q_OBJECT
public:
    explicit mlvManager(QObject *parent = 0);

private:
    int currentId;

    //Словарь имён
    QList<elementNamesTable*> namesTable;

    //Таблица связий
    QList<elementRelationsTable*> relationsTable;

    //Дуги падежа
    QList<int> caseFrameArcs;

    QMap<QString,int> mapPronous;

    int generateId();
    void createCaseFrameArcs();
    void createSystemArcs();

    //Вспомогательные функции для извлечения елментов из Таблицы "Имена"
    int getIdByTheName_NamesTable(QString name);
    QString getNameByTheId_NamesTable(int id);

    //Вспомогательные функции для извлечения елментов из Таблицы "Связи"
    int getArcByTheNodes(int idNodeStart,int idNodeEnd);
    int getIdNodeByTheNodeAndArc_RelationsTable(int idNode,int idAlpha,int switchNumber);
    QList<int> getChildrensNode_RelationsTable(int idNode);
    QList<int> getParentsNode_RelationsTable(int idNode);


    //Вспомогательные функции для поиска по сети
    bool checkVerb(QString verb);
    int checkSubject(QString subject);
    bool checkEmptyNode(int idNode);
    QString convertIdImageToName(int idNode);

    int findImageCaseFrameByTheSubject(int idImageSubject);
    int findImageBySubject(int idImageSubject);


    //Фундоментальные функции сети
    int atom(QString name);
    QString mota(int id);
    void setAttr(int idA,int idAlpha,int idB); //Добавление дуги с именем

    int newNode();                             //Создание не именованной вершины.
                                               //именнованные создаются с помощью atom

    bool exist(int idA,int idAlpha);           //Существует ли такая дуга

    QList<int> getListInstanseNode(int idNode);
    int getIdFrameByCaseFrame(int idNode, QString pronouns);
    int idPronounsNode(QString answer, QMap<int, int> mapCaseFrame);
    QString createAnswer(QList<int> listInstance,int idInstanceCaseFrame);

    QMap<int,int> buildCaseFrame(int idCaseFrame, QString verb, int idImageBySubject);
    
public slots:
      void fillMlvNet(QList<Node *> listNode);
      QString startMlv(QString sentence);
    
};

#endif // MLVMANAGER_H
